package com.sojson.project.sys.user.controller.param.verify;

import java.io.IOException;
import java.util.Set;

import com.sojson.base.impl.BaseUser;
import com.sojson.config.exception.TransErrorCode;
import com.sojson.constant.DataScopeType;
import com.sojson.enums.core.EVerifyCodePrefix;
import com.sojson.project.sys.user.entity.bo.AuthcUser;
import com.sojson.project.sys.user.entity.dto.UserAdminDto;
import com.sojson.project.sys.user.entity.po.UserAdmin;
import com.sojson.result.Result;
import com.sojson.util.ExpUtil;
import com.sojson.util.MatcheUtil;
import com.sojson.util.StringUtil;
import com.sojson.util.param.ParamUtil;
import com.sojson.util.token.TokenDto;
import com.sojson.util.token.TokenUtil;
import com.sojson.util.verifycode.VerifyCodeUtil;

import io.jsonwebtoken.Claims;

/**
 * 管理员用户表控制器参数验证
 * 
 * @author liu
 * @date 2021-03-16
 */
public class UserAdminParamVerify {

    /**
     * 通过id更新
     * 
     * @param dto
     * @return
     */
    public static Result<Boolean> updateInfo(UserAdminDto dto) {
        String id = dto.getId();
        if (StringUtil.isBlank(id)) {
            return Result.fail("ID不能为空！");
        }
        String mobile = dto.getMobile();
        if (StringUtil.isNotBlankObject(mobile) && !MatcheUtil.isMobile(mobile)) {
            return Result.fail("手机号格式错误！");
        }

        return Result.success();
    }

    /**
     * 通过id验证旧密码修改密码
     * 
     * @param dto
     * @return
     */
    public static Result<Boolean> updatePwdByOldPwd(AuthcUser dto) {
        if (StringUtil.isBlank(dto.getOldPwd())) {
            return Result.fail("旧密码不能为空！");
        }
        if (StringUtil.isBlank(dto.getPwd())) {
            return Result.fail("密码不能为空！");
        }

        return Result.success();
    }

    /**
     * 帐号密码注册
     * 
     * @param dto
     * @return
     * @throws Exception 
     */
    public static Result<Boolean> pwdRegister(TokenDto dto) throws Exception {
        BaseUser user = dto.getUser();
        if (StringUtil.isBlankObject(user)) {
            return Result.fail("user参数不能为空！");
        }
        if (StringUtil.isBlank(user.getUsername())) {
            return Result.fail("帐号不能为空！");
        }
        Set<String> roleIds = dto.getRoleIds();
        if (StringUtil.isBlankObject(roleIds) || roleIds.size() < 1) {
            return Result.fail("角色ID不能为空！");
        }
        if (ParamUtil.isAdminSuper(TokenUtil.getRoles(roleIds))) {
            ExpUtil.throwEx("不能设置为超级管理员");
        }
        ParamUtil.verifyRoleIdExist(roleIds);
        String deptId = user.getDeptId();
        if (StringUtil.isBlankObject(deptId)) {
            return Result.fail("归属部门不能为空！");
        }
        ParamUtil.verifyDept(deptId);
        Integer dataScope = user.getDataScope();
        if (StringUtil.isBlankObject(dataScope)) {
            return Result.fail("权限范围不能为空！");
        }
        if (dataScope != DataScopeType.DATA_SCOPE_CUSTOM) {
            dto.setDepts(null);
        }
        if (dataScope == DataScopeType.DATA_SCOPE_ALL
            && TokenUtil.getUser().getDataScope() != DataScopeType.DATA_SCOPE_ALL) {
            return Result.fail("部门权限不足！");
        }
        Set<String> depts = dto.getDepts();
        if (depts != null && depts.size() > 0) {
            ParamUtil.verifyDept(depts);
        }

        return Result.success();
    }

    /**
     * 密码登录
     * 
     * @param dto
     * @return
     * @throws Exception 
     */
    public static Result<String> pwdLogin(TokenDto dto) throws Exception {
        String verifyCodeValue = dto.getVerifyCodeValue();
        if (StringUtil.isBlank(verifyCodeValue)) {
            return Result.fail("验证码不能为空！");
        }
        BaseUser user = dto.getUser();
        if (StringUtil.isBlankObject(user)) {
            return Result.fail("user参数不能为空！");
        }
        String username = user.getUsername();

        if (StringUtil.isBlank(username)) {
            return Result.fail("帐号不能为空！");
        }
        if (StringUtil.isBlank(user.getPwd())) {
            return Result.fail("密码不能为空！");
        }
        Claims claims = TokenUtil.getClaims();
        if (StringUtil.isBlankObject(claims)) {
            return Result.fail("Token不能为空！");
        }
        String verifyCodePrefix = dto.getVerifyCodePrefix();
        if (StringUtil.isBlank(verifyCodePrefix)) {
            dto.setVerifyCodePrefix(EVerifyCodePrefix.AUTHC_WEB.toString());
        }
        String id = claims.getId();
        if (!VerifyCodeUtil.verifyAndClearCode(
            new StringBuilder(id).append(VerifyCodeUtil.IMG).append(dto.getVerifyCodePrefix()).toString(),
            verifyCodeValue)) {
            return Result.fail(TransErrorCode.ERR_CODES.getMsg());
        }

        return Result.success();
    }

    /**
     * 通过id更新
     * 
     * @param dto
     * @return
     * @throws IOException 
     */
    public static Result<Boolean> updateById(UserAdminDto dto) throws IOException {
        String id = dto.getId();
        if (StringUtil.isBlank(id)) {
            return Result.fail("ID不能为空！");
        }
        String mobile = dto.getMobile();
        if (StringUtil.isNotBlankObject(mobile) && !MatcheUtil.isMobile(mobile)) {
            return Result.fail("手机号格式错误！");
        }
        // 判断角色是否包含
        Set<String> roleIds = dto.getRoleIds();
        if (StringUtil.isBlankObject(roleIds) || roleIds.size() < 1) {
            return Result.fail("角色ID不能为空！");
        }
        if (ParamUtil.isAdminSuper(TokenUtil.getRoles(roleIds))) {
            ExpUtil.throwEx("不能设置为超级管理员");
        }
        ParamUtil.verifyRoleIdExist(roleIds);
        String deptId = dto.getDeptId();
        if (StringUtil.isBlankObject(deptId)) {
            return Result.fail("归属部门不能为空！");
        }
        ParamUtil.verifyDept(deptId);
        Integer dataScope = dto.getDataScope();
        if (StringUtil.isBlankObject(dataScope)) {
            return Result.fail("权限范围不能为空！");
        }
        if (dataScope != DataScopeType.DATA_SCOPE_CUSTOM) {
            dto.setDeptIds(null);
        }
        if (dataScope == DataScopeType.DATA_SCOPE_ALL
            && TokenUtil.getUser().getDataScope() != DataScopeType.DATA_SCOPE_ALL) {
            dto.setDataScope(null);
            dto.setDeptIds(null);
        }
        Set<String> depts = dto.getDeptIds();
        if (depts != null && depts.size() > 0) {
            ParamUtil.verifyDept(depts);
        }

        return Result.success();
    }

    /**
     * 密码重置
     * 
     * @param dto
     * @return
     * @throws Exception 
     */
    public static Result<Boolean> resetUserPwd(UserAdmin dto) {
        String id = dto.getId();
        if (StringUtil.isBlank(id)) {
            return Result.fail("ID不能为空！");
        }

        return Result.success();
    }

    /**
     * 通过id修改状态
     * 
     * @param dto
     * @return
     * @throws Exception 
     */
    public static Result<Boolean> updateStatus(UserAdmin dto) {
        String id = dto.getId();
        if (StringUtil.isBlank(id)) {
            return Result.fail("ID不能为空！");
        }
        Integer status = dto.getStatus();
        if (StringUtil.isBlank(status)) {
            return Result.fail("状态不能为空！");
        }

        return Result.success();
    }

}